package com.thiswhyme.ratelimiter.core;

/**
 * @description: 限流器接口
 * @author: thiswhyme
 * @date: 2021/8/30
 */
public interface LimitHandler {

    /**
     * 尝试访问（支持组合两级key）
     * @param key 限流器一级key（可用于定义为被保护的资源）
     * @param subKey 限流器二级级key（可用于定义热点参数，不传等同于tryAccess(String key, long rate, long rateIntervalMillis)）
     * @param rate 单位时间访问数
     * @param rateIntervalMillis 单位时间（毫秒）
     * @return
     */
    boolean tryAccess(String key, String subKey, long rate, long rateIntervalMillis);

    /**
     * 尝试访问
     * @param key 限流器key（可用于定义为被保护的资源）
     * @param rate 单位时间访问数
     * @param rateIntervalMillis 单位时间（毫秒）
     * @return
     * @throws Exception
     */
    boolean tryAccess(String key, long rate, long rateIntervalMillis);

    /**
     * 尝试访问（支持设置占数据计算值permits和等待时间waitTimeoutMillis）
     * @param key 限流器一级key（可用于定义为被保护的资源）
     * @param subKey 限流器二级级key（可用于定义热点参数，不传等同于tryAccess(String key, long rate, long rateIntervalMillis)）
     * @param rate 单位时间访问数
     * @param rateIntervalMillis 单位时间（毫秒）
     * @param permits 占permits的速度计算值
     * @param waitTimeoutMillis 等待时间（毫秒）
     * @return
     */
    boolean tryAccess(String key, String subKey, long rate, long rateIntervalMillis, long permits, long waitTimeoutMillis);

    /**
     * 尝试访问（（支持组合两级key，支持设置占数据计算值permits和等待时间waitTimeoutMillis）
     * @param key 限流器key（可用于定义为被保护的资源）
     * @param rate 单位时间访问数
     * @param rateIntervalMillis 单位时间（毫秒）
     * @param permits 占permits的速度计算值
     * @param waitTimeoutMillis 等待时间（毫秒）
     * @return
     */
    boolean tryAccess(String key, long rate, long rateIntervalMillis, long permits, long waitTimeoutMillis);
}
